package com.deft.design.simple;

/**
 * @author zdl
 * @description 双重检测锁
 * @date 2022-04-22
 **/
public class DoubleCheckSingleton {

    /**
     * volatile保证变量的原子性，禁止指令重排
     */
    private static volatile DoubleCheckSingleton instance;

    private DoubleCheckSingleton() {
        System.out.println("双重锁校验（线程安全）：");
        System.out.println("\r 双重锁的方式是方法级锁的优化，减少了部分获取实例的耗时。");
        System.out.println("\r 同时这种方式也满足了懒加载。");
    }

    public static DoubleCheckSingleton getInstance() {
        if (instance == null) {
            // 开启同步锁，保证只有一个线程能拿到锁创建对象
            synchronized (DoubleCheckSingleton.class) {
                // 防止多个线程拿到锁进行等待之后进入创建对象，再判断一次防止重复创建
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}
